package com.tpay.server;

import java.sql.SQLException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.tpay.shared.exception.MyException;

public class ServerExceptionHelper {
	private static Logger logger = LoggerFactory.getLogger(ServerExceptionHelper.class);
	
	public static MyException process(Throwable e) {
		MyException appEx = null;
		
		Throwable cause = getRootCause(e);
		
		if(cause instanceof java.sql.SQLException) {
			SQLException sqlEx = (SQLException)cause;
			String sqlMessage = getSqlMessage(sqlEx.getErrorCode());

			logger.debug("AppException-errorcode => " + sqlEx.getErrorCode());
			logger.debug("AppException-cause => " + cause);
			logger.debug("AppException-message => " + sqlMessage);
			logger.debug("AppException-message(detail) => " + cause.getMessage());

			appEx = new MyException(sqlMessage, cause);
		}
		else {
			String msg = null;
			
			if(cause instanceof javax.persistence.EntityExistsException) {
				msg = "하이버네이트 세션에 이미 동일한 entity가 존재합니다.";
				appEx = new MyException(msg, cause);
			} else if(cause instanceof javax.persistence.EntityNotFoundException) {
				msg = "키값에 해당하는 레코드가 존재하지 않습니다.";
				appEx = new MyException(msg, cause);
			} else if(cause instanceof org.hibernate.PropertyValueException) {
				msg = "not null 컬럼에 null 값을 입력하려고 하였습니다.";
				appEx = new MyException(msg, cause);
			} else {
				msg = cause.getMessage();
				appEx = new MyException(msg, cause);
			}
			
			logger.debug("AppException-cause => " + cause);
			logger.debug("AppException-message => " + msg);
			logger.debug("AppException-message(detail) => " + cause.getMessage());
		}

		return appEx;
	}
	
	public static Throwable getRootCause(Throwable e) {
		Throwable rootCause = e;
		Throwable cause = e.getCause();
		while (cause != null && cause != rootCause) {
			rootCause = cause;
			cause = cause.getCause();
		}

		return rootCause;
	}
	
	public static String getSqlMessage(int errorCode) {
		switch(errorCode) {
		case 12899:
			return "길이가 초과되었습니다.";
		case 1:
			return "이미 존재하는 값이 있습니다.";
		}
		
		
		return "데이터베이스 처리 중  에러가 발생하였습니다.";
	}
}
